package cn.bluemobi.dylan.viewpagerfragmentlazyload;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

/**
 * Fragment预加载问题的解决方案： 1.可以懒加载的Fragment 2.切换到其他页面时停止加载数据（可选） Created by yuandl
 * on 2016-11-17. blog
 * ：http://blog.csdn.net/linglongxin24/article/details/53205878
 */

public abstract class LazyLoadFragment extends Fragment {
	/**
	 * 视图是否已经初初始化
	 */
	protected boolean isInit = false;
	protected boolean isLoad = false;
	protected final String TAG = "itchen";
	private View view;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		view = inflater.inflate(setContentView(), container, false);
		isInit = true;
		/** 初始化的时候去加载数据 **/
		isCanLoadData();
		return view;
	}

	/**
	 * 视图是否已经对用户可见，系统的方法
	 */
	@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
		isCanLoadData();
	}

	/**
	 * 是否可以加载数据 可以加载数据的条件： 1.视图已经初始化 2.视图对用户可见
	 */
	private void isCanLoadData() {
		if (!isInit) {
			return;
		}

		if (getUserVisibleHint()) {
			lazyLoad();
			isLoad = true;
		} else {
			if (isLoad) {
				stopLoad();
			}
		}
	}

	/**
	 * 视图销毁的时候讲Fragment是否初始化的状态变为false
	 */
	@Override
	public void onDestroyView() {
		super.onDestroyView();
		isInit = false;
		isLoad = false;

	}

	protected void showToast(String message) {
		if (!TextUtils.isEmpty(message)) {
			Toast.makeText(LazyLoadFragment.this.getActivity(), message, Toast.LENGTH_SHORT).show();
		}

	}

	/**
	 * 设置Fragment要显示的布局
	 * 
	 * @return 布局的layoutId
	 */
	protected abstract int setContentView();

	/**
	 * 获取设置的布局
	 * 
	 * @return
	 */
	protected View getContentView() {
		return view;
	}

	/**
	 * 找出对应的控件
	 * 
	 * @param id
	 * @param <T>
	 * @return
	 */
	protected <T extends View> T findViewById(int id) {

		return (T) getContentView().findViewById(id);
	}

	/**
	 * 当视图初始化并且对用户可见的时候去真正的加载数据
	 */
	protected abstract void lazyLoad();

	/**
	 * 当视图已经对用户不可见并且加载过数据，如果需要在切换到其他页面时停止加载数据，可以调用此方法
	 */
	protected void stopLoad() {
	}
}
